#ifndef FPLAYER_FFMPEGENCODER_H
#define FPLAYER_FFMPEGENCODER_H

#include "IEncoder.h"

/**
 * author: x-fan
 * date: 2024/1/9
 * desc: FFMpeg的编码器
 */
class FFMpegEncoder : public IEncoder {

private:
  //编码器上下文
  AVCodecContext *_pCodecCtx = nullptr;
  //编码器上下文的字典
  AVDictionary *_pOptions = nullptr;
  //经过编码后的数据包
  AVPacket *_pPacket = nullptr;

protected:

  /**
   * 查询AVCodec
   * @param encoderParam 编码器参数
   * @return AVCodec
   */
  virtual const AVCodec *findCodec(EncoderParam &encoderParam) = 0;

  /**
   * 初始化编码器的上下文
   * @param pCodecCtx 编码器上下文
   * @param encoderParam 编码器参数
   * @return 0 表示成功
   */
  virtual int32_t initContextParam(AVCodecContext *pCodecCtx, EncoderParam &encoderParam) = 0;

public:
  using IEncoder::IEncoder;

  virtual ~FFMpegEncoder() = default;

  bool initEncoder(EncoderParam &encoderParam) override;

  void releaseEncoder() override;

  bool startEncode(AVFrame *pFrame) override;
};


#endif //FPLAYER_FFMPEGENCODER_H
